package com.youshang.designpattern.chain.handler;

import lombok.Data;

import java.util.Objects;

@Data
public abstract class HandleBase {

    /**
     * 上一个处理器
     */
    protected HandleBase previous;

    /**
     * 下一个处理器
     */
    protected HandleBase next;

    /**
     * 处理器链头节点
     */
    protected HandleBase head;

    /**
     * 当前对象产生异常时，是否执行回滚函数。true：执行，false：不执行。
     */
    protected boolean rollbackSelf = false;

    /**
     * 是否为当前对象产生的异常标志。
     */
    protected boolean selfError = false;

    /**
     * 处理器链尾节点
     */
    protected HandleBase tail;

    private HandleBase nextHandler;

    private HandleRequest request;

    /**
     * 执行处理器方法，链式调用
     *
     * @param request 企业信息操作上下文
     */
    public void start(HandleRequest request) {
        this.request = request;
        try {
            this.execute(request);
            if (Objects.nonNull(next)) {
                next.start(request);
            }
        } catch (Exception e) {
            this.selfError = true;
            rollback(request);
            throw e;
        }
    }


    /**
     * 是否可以处理
     * @param request
     * @return
     */
    public abstract boolean rollback(HandleRequest request);

    /**
     * 处理
     * @param request
     */
    public abstract void execute(HandleRequest request);


}
